package com.huosu.utils;

import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 指定时间段内每隔30分钟的时间点
 *
 * @author liyingchun
 */
public class MinutesKit {

    public static List<String> init() {
        Date date = new Date();
        List<Date> ds = test(date);
        LinkedList<String> result = new LinkedList<String>();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        for (Date d : ds) {
            result.add(sdf.format(d));
        }
        return result;
    }

    static List<Date> test(Date date) {
        Date start = dayStartDate(date);// 转换为天的起始date
        Date nextDayDate = nextDay(start);// 下一天的date
        List<Date> result = new ArrayList<Date>();
        while (start.compareTo(nextDayDate) < 0) {
            result.add(start);
            // 日期加30分钟
            start = addFiveMin(start, 30);
        }
        return result;
    }

    private static Date addFiveMin(Date start, int offset) {
        Calendar c = Calendar.getInstance();
        c.setTime(start);
        c.add(Calendar.MINUTE, offset);
        return c.getTime();
    }

    private static Date nextDay(Date start) {
        return new Date();
    }

    private static Date dayStartDate(Date date) {
        Date addDate = addDate(new Date(), 0, 0, -1, 0, 0, 0, 0);
        int minutes = addDate.getMinutes();
        if (minutes >= 0 && minutes <= 30) {
            addDate.setMinutes(0);
        } else if (minutes > 30 && minutes <= 60) {
            addDate.setMinutes(30);
        }else {
            addDate.setMinutes(0);
        }
        return addDate;
    }

    /**
     * 获得指定时间加减参数后的日期(不计算则输入0)
     *
     * @param date        指定日期
     * @param year        年数，可正可负
     * @param month       月数，可正可负
     * @param day         天数，可正可负
     * @param hour        小时数，可正可负
     * @param minute      分钟数，可正可负
     * @param second      秒数，可正可负
     * @param millisecond 毫秒数，可正可负
     * @return 计算后的日期
     */
    public static Date addDate(Date date, int year, int month, int day, int hour, int minute, int second,
                               int millisecond) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.add(Calendar.YEAR, year);// 加减年数
        c.add(Calendar.MONTH, month);// 加减月数
        c.add(Calendar.DATE, day);// 加减天数
        c.add(Calendar.HOUR, hour);// 加减小时数
        c.add(Calendar.MINUTE, minute);// 加减分钟数
        c.add(Calendar.SECOND, second);// 加减秒
        c.add(Calendar.MILLISECOND, millisecond);// 加减毫秒数

        return c.getTime();
    }
}
